package frsf.cidisi.exercise.modelo.situationCalculus.actions;

import frsf.cidisi.exercise.modelo.situationCalculus.AgenteEstado;
import frsf.cidisi.exercise.modelo.util.Coordenada;
import frsf.cidisi.exercise.modelo.util.Laberinto;
import frsf.cidisi.exercise.modelo.util.Orientacion;
import frsf.cidisi.faia.agent.situationcalculus.SituationCalculusAction;
import frsf.cidisi.faia.state.AgentState;
import frsf.cidisi.faia.state.EnvironmentState;

public class Avanzar extends SituationCalculusAction {
	
	private static int tam = 4;

    @Override
    public EnvironmentState execute(AgentState ast, EnvironmentState est) {
        
        // TODO: Complete Method
    	AgenteEstado agState = (AgenteEstado) ast;

		// Avanzo un casillero si esta permitido
		Coordenada nueva = avanzar(agState.getPosAgente(), agState.getLaberinto(), agState.getOrientacion());
		agState.setposAgente(nueva);
        
        return est;
    }
    
	public Coordenada avanzar(Coordenada posActual, Laberinto laberinto, Orientacion orientacion) {

		switch (orientacion.getValue()) {
		case 1:
			if(!laberinto.getCelda(posActual).getParedNorte() && posActual.getY().intValue() > 0)
				return new Coordenada(posActual.getX().intValue(), posActual.getY().intValue()-1);
			break;

		case 2:
			if(!laberinto.getCelda(posActual).getParedSur() && posActual.getY().intValue() < (tam-1))
				return new Coordenada(posActual.getX().intValue(), posActual.getY().intValue()+1);
			break;

		case 3:
			if(!laberinto.getCelda(posActual).getParedEste() && posActual.getX().intValue() < (tam-1))
				return new Coordenada(posActual.getX().intValue()+1, posActual.getY().intValue());
			break;

		case 4:
			if(!laberinto.getCelda(posActual).getParedOeste() && posActual.getX().intValue() > 0)
				return new Coordenada(posActual.getX().intValue()-1, posActual.getY().intValue());
			break;
		}
		return posActual;
	}

    @Override
    public String toString() {
        return "Avanzar";
    }
}

